﻿using System;
using System.Linq;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using ServirMovil.Formularios;
using ServirMovil.ServicioWS;
using ServirMovil.Clases.Negocio;
using GS1.Library;
using ServirMovil.Clases.Movil;

namespace ServirMovil
{
    public partial class frmBuscarExpediente : frmBase
    {
        #region --- Variables y Constantes ---
        private Expediente expediente = null;
        #endregion

        #region --- Constructor ---
        public frmBuscarExpediente()
        {
            InitializeComponent();
        }
        #endregion

        #region --- Eventos Formulario ---
        private void frmBuscarExpediente_Load(object sender, EventArgs e)
        {
            cargarFormulario();
        }

        private void mnuSalir_Click(object sender, EventArgs e)
        {
            salir();
        }

        private void btnBuscar_Click(object sender, EventArgs e)
        {
            buscar();
        }

        private void btnExExpediente_Click(object sender, EventArgs e)
        {
            MetodosAplicacion.tecladoVisible(this.txtNroExpediente);
        }
        #endregion

        #region --- Eventos LectorRFID ---
        protected override void OnInicioCapturaData()
        {
            // Estableciendo propiedades de buscando
            this.pnlBusqueda.BackColor = Color.Yellow;
            this.lblBusqueda.Text = "Buscando...";

            // Mostrar panel de busqueda
            this.pnlBusqueda.Visible = true;
            this.pnlBusqueda.BringToFront();
            this.pnlBusqueda.Refresh();
        }
        
        protected override void OnCapturaData(GS1.PsionRFID.Tag tag)
        {
            // Validar que sea una etiqueta con la cabecera de servir
            if (MetodosAplicacion.esEtiquetaValida(tag.Epc))
            {
                procesarLectura(tag.Epc);
            }
        }

        protected override void OnFinCapturaData(GS1.PsionRFID.ListaTag listaTag)
        {
            if (this.pnlBusqueda.BackColor.Equals(Color.Yellow))
            {
                this.pnlBusqueda.Visible = false;
                this.pnlBusqueda.Refresh();
            }
        }
        #endregion

        #region --- Metodos Propios ---
        private void cargarFormulario()
        {
            try
            {
                Cursor.Current = Cursors.WaitCursor;

                MetodosAplicacion.configuraFormulario(this);

                this.txtNroExpediente.Focus();
            }
            catch (Exception ex)
            {
                mostrarMensajeError(ex, this.lblTitulo.Text);
            }
            finally
            {
                Cursor.Current = Cursors.Default;
            }
        }

        private bool validarBusqueda()
        {
            this.txtAnioExpediente.Text = this.txtAnioExpediente.Text.Trim();
            this.txtNroExpediente.Text = this.txtNroExpediente.Text.Trim();

            if (this.txtAnioExpediente.Text.Equals(string.Empty))
            {
                Util.CampoNecesario(this.txtAnioExpediente, "Debe ingresar el anio del expediente");
                return true;
            }

            if (this.txtNroExpediente.Text.Equals(string.Empty))
            {
                Util.CampoNecesario(this.txtNroExpediente, "Debe ingresar el numero del expediente");
                return true;
            }

            return false;
        }

        private void buscar()
        {
            // Ocultando mostrar de busqueda
            this.pnlBusqueda.Visible = false;

            if (this.btnBuscar.Text.Equals("O"))
            {
                // Validando campos de entrada
                if (validarBusqueda()) { return; }

                // Validando si el expediente es valido
                if (!ejecutarBusqueda()) { return; }

                this.txtAnioExpediente.ReadOnly = true;
                this.txtNroExpediente.ReadOnly = true;

                this.txtAnioExpediente.BackColor = Color.Yellow;
                this.txtNroExpediente.BackColor = Color.Yellow;

                this.btnBuscar.Text = "X";
            }
            else
            {
                this.txtAnioExpediente.ReadOnly = false;
                this.txtNroExpediente.ReadOnly = false;

                this.txtAnioExpediente.BackColor = Color.White;
                this.txtNroExpediente.BackColor = Color.White;

                this.btnBuscar.Text = "O";

                this.expediente = null;
            }
        }

        private bool ejecutarBusqueda()
        {
            bool resultado = false;
            Expediente[] listaExpediente = null;
            Etiqueta etiqueta = null;

            try
            {
                Cursor.Current = Cursors.WaitCursor;

                // Estableciendo campo del expediente a buscar
                etiqueta = new Etiqueta();

                etiqueta.expediente = new Expediente();
                etiqueta.expediente.anio = this.txtAnioExpediente.Text;
                etiqueta.expediente.numero = this.txtNroExpediente.Text;

                using (Interfase interfase = new Interfase())
                {
                    listaExpediente = interfase.buscarExpedienteEtiqueta(etiqueta);
                }

                // Validar si se encontro expediente a buscar
                if (listaExpediente != null && listaExpediente.Length > 0)
                {
                    // Validar que solo haya un expediente
                    if (listaExpediente.Length == 1)
                    {
                        // Estableciendo expediente a buscar
                        this.expediente = listaExpediente[0];

                        // Expediente encontrado OK
                        resultado = true;
                    }
                    else
                    {
                        Util.ShowMessageboxInfo("Se han encontrado mas un expediente asociado a la misma numeración por favor verificar");
                    }
                }
                else
                {
                    Util.ShowMessageboxExclamacion("no se encontrarón expedientes relacionados");
                }
            }
            catch (Exception ex)
            {
                mostrarMensajeError(ex, this.lblTitulo.Text);
            }
            finally
            {
                Cursor.Current = Cursors.Default;
            }

            return resultado;
        }

        private void procesarLectura(string epc)
        {
            // Validar que haya buscado primero el expediente
            if (this.expediente == null) { return; }

            bool encontrado = false;
            bool resultado = false;

           foreach (Etiqueta etiqueta in this.expediente.listaEtiqueta)
            {
                encontrado = etiqueta.epc.Equals(epc);
                if (encontrado) {
                    using (Interfase interfase = new Interfase())
                    {
                        resultado = interfase.registrarMovimientoEtiqueta(etiqueta, ParametrosAplicacion.SEDE_ACTUAL, ParametrosAplicacion.USUARIO_ACTUAL);
                    }
                    break; 
                }
            }

            // Comparar si encontro expediente buscado
            this.pnlBusqueda.BackColor = encontrado ? Color.Green : Color.Yellow;
            this.lblBusqueda.Text = encontrado ? "Encontrado" : "Buscando...";

            // Mostrar panel de busqueda
            this.pnlBusqueda.BringToFront();
            this.pnlBusqueda.Refresh();

            if (encontrado)
            {
                Util.ShowMessageboxInfo("Se ha encontrado el expediente");
            }
        }

        private void salir()
        {
            this.Close();
        }
        #endregion
    }
}